home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 6 / FM Towns Free Software Collection 6.iso / ms_dos / nifp / nifplog.c < prev    next >
Text File  |  1993-07-08  |  50KB  |  2,231 lines

  1. /*
  2.  *     このモジュールは,NIFPのタイトル区分処理部です。主にログファイルを読み込んで,
  3.  *    タイトルテーブルを作成します。
  4.  *     このモジュールは,マシン依存していません。
  5.  */
  6.  
  7. #include "nifp.h"
  8.  
  9. char hpid[9],hpmsg[63],forummsg[81],forumname[20],savebuf[81];
  10. char mestno[20][81];
  11. char libtno[20][81];
  12. char niftyid[9];
  13. char profid[9];
  14. char patioid[9];
  15. int fmeslibno=0,forumon=0;
  16. int titlecountr=0;
  17. char far *po;
  18. int gp=0;
  19. int pend=0;
  20. char heya[3],saveheya[3];
  21. long jpp=0,jpplno=0,savepp=0,savepplno=0,fsavepp=0;
  22. long xxp=0,xxplno=0;
  23. int jumpon=0,submode=0,linecount=0,preno=0;
  24. long forum3msgp=0,forum3lno=0;
  25. static FILE *nifoutfd;
  26. static FILE *nifoutfd2;
  27. static char nifoutfname[140];
  28. static char nifoutfname1[129];
  29. static char nifoutfname2[129];
  30.  
  31. char *initial="<< オープニング メッセージ >>  ";
  32. char *dataend="          << データの終わり >>";
  33. char *spalate=" ------------------------------------- ";
  34. char *newstitle="<< ニュース >>";
  35. char *sinbuntitle="<< ニュース速報 >>";
  36. char *etctitle="<< その他 >>";
  37. char *mailtitle="<< 電子メール >>  ";
  38. char *hptitle="<< ホームパーティ >>";
  39. char *forumtitle="<< フォーラム >>";
  40. char *forum2title="会議室";
  41. char *bbstitle="<< 掲示板 >>";
  42. char *notetitle="<< お知らせ >>";
  43. char *billtitle="<< 課金情報 >>  ";
  44. char *cbtitle="<< CB >>";
  45. char *byetitle="<< ログオフ >>  ";
  46. char *toptitle="<< トップメニュー >>";
  47. char *membertitle="<< 会員情報 >>";
  48. char *infotitle="<< 情報サービス >>";
  49. char *tenkititle="<< 天気予報 >>";
  50. char *writetitle="## 発言 ##  ";
  51. char *guesttitle="## ゲスト情報 ##";
  52. char *titlehptitle="<タイトル一覧>";
  53. char *mrcvtitle="## 受信一覧 ##";
  54. char *sdltitle="## 送信簿 ##";
  55. char *rcltitle="## 受信簿 ##";
  56. char *myforumtitle="<入会フォーラム一覧>";
  57.  
  58. static int cutsub(char *buf)
  59. {
  60.     int i;
  61.     char buf1[81];
  62.  
  63.     for(i=0;i < MAXCUTNO && cutstrtbl[i];i++) {
  64.         _fstrcpy((char far *)buf1,cutstrtbl[i]);
  65.         if(!xstrncmp(buf,&buf1[1])) {
  66.             if(buf1[0] == '1') return(1);
  67.             else               return(2);
  68.         }
  69.     }
  70.     return(0);
  71. }
  72.  
  73. int bunget(PCELL far *tcu, int mode)    /* 内容表示用読み込み */
  74. {
  75.     char c,buf[81],buf2[81],savec = 0;
  76.     int i=0,j,m,k,savemore = 0;
  77.     long nl;
  78.  
  79.     tbl_set(tcu);
  80.     xxfseek(tcu,tcu->p->top);
  81.     nl = tcu->p->tail;
  82.     if(xftell() == nl) return(0);
  83.     for(k = 1;k < MAXLINE;k++) {
  84.         if(xftell() >= nl && nl)    break;
  85.         if(savec) {
  86.             savec = 0;
  87.             for(j=0;j < 80-i && (c = buf[i+j]);j++) {
  88.                 buf[j] = c;
  89.                 if(c == '\n') {
  90.                     buf[++j] = 0;
  91.                     break;
  92.                 }
  93.             }
  94.             if(buf[j-1] != '\n') {
  95.                 if(!xfgets(&buf[j],81-j))    break;
  96.             }
  97.         }
  98.         else if(!xfgets(buf,81))    break;
  99.         for(i = j = 0,m = 1;(c = buf[i]);i++) {
  100.             if(c == '\b') {
  101.                 if(m > 1) {
  102.                     j--;
  103.                     m--;
  104.                 }
  105.                 continue;
  106.             }
  107.             if(m > 80) {
  108.                 savec = 1;
  109.                 break;
  110.             }
  111.             if(iskanji(c)) {
  112.                 if(m >= 80) {
  113.                     savec = 1;
  114.                     break;
  115.                 }
  116.                 buf2[j++] = c;
  117.                 buf2[j++] = buf[++i];
  118.                 m++; m++;
  119.                 continue;
  120.             }
  121.             buf2[j++] = c;
  122.             m++;
  123.             if(mode && c == '\t') {
  124.                 for(;(m-1)%(tabno);) m++;
  125.                 if(m >= 80) {
  126.                     savec = 1;
  127.                     i++;
  128.                     break;
  129.                 }
  130.                 continue;
  131.             }
  132.             if(c == '\n') break;
  133.         }
  134.         if(xfeof() && c != '\n') buf2[j++] = '\n';
  135.         buf2[j] = 0;
  136.         if(cutmode) {
  137.             if(savemore) {
  138.                 savemore = 0;
  139.                 if(!xstrncmp(buf2,">") || !xstrncmp(buf2,":")) {
  140.                     k--;
  141.                     farfree(buf1[k-1]);
  142.                     buf1[k-1] = 0;
  143.                     k--;
  144.                     continue;
  145.                 }
  146.             }
  147.             else {
  148.                 switch(cutsub(buf2)) {
  149.                 case 1: k--; continue;
  150.                 case 2: savemore = 1;
  151.                 }
  152.             }
  153.         }
  154.         buf1[k-1] = (char far *)farmalloc((long)strlen(buf2)+1);
  155.         if(!buf1[k-1])    {
  156.             errdisp1(memgeterror);
  157.             break;
  158.         }
  159.         _fstrcpy(buf1[k-1],(char far *)buf2);
  160.     }
  161.     if(savemore) {
  162.         k--;
  163.         farfree(buf1[k-1]);
  164.         buf1[k-1] = 0;
  165.     }
  166.     if(cutmode == 3) {
  167.         _fstrcpy((char far *)buf2,buf1[k-2]);
  168.         if((!xstrncmp(buf2,"- ") && strstr(buf2,"MES("))
  169.          || !xstrncmp(buf2,"-会議室")) {
  170.             farfree(buf1[k-2]);
  171.             buf1[k-2] = 0;
  172.             k--;
  173.         }
  174.     }
  175.     if(mode && cutmode >= 2) {
  176.         for(;k > 2;k--) {
  177.             if(buf1[k-2][0] == '\n') {
  178.                 farfree(buf1[k-2]);
  179.                 buf1[k-2] = 0;
  180.             }
  181.             else break;
  182.         }
  183.     }
  184.     return(k);
  185. }
  186.  
  187. static int bytedec(char *a) {
  188.     int i=0;
  189.  
  190.     if(!isdigit(a[0])) {
  191.         if(a[0] != ' ') return(i);
  192.     }
  193.     else i = (int)(a[0] - '0');
  194.     if(isdigit(a[1]))
  195.         i = i * 10 + (int)(a[1] - '0');
  196.     return(i);
  197. }
  198.  
  199. void str79set(char *buf)
  200. {
  201.     if(strlen(buf) >= 79) {
  202.         if(nthctype(buf,78) == CT_KJ1) buf[78] = 0;
  203.         else buf[79] = 0;
  204.     }
  205. }
  206.  
  207. static int
  208. setpoint(char mode,long grp,char *buf)  /* タイトルテーブル作成 */
  209. {
  210.     PCELL far *pt;
  211.     PCELL far *w;
  212.  
  213.     if(sepamode && mode == NSEPA)
  214.         return(0);
  215.     str79set(buf);
  216.     pt = tbl_alloc(0);
  217.     if(!pt) {
  218.         errdisp3(memgeterror);
  219.         return(-1);
  220.     }
  221.     tbl_set(pt);
  222.     pt->mode = mode;
  223.     pt->count = p+1;
  224.     pt->p->lineno = xxplno+1;
  225.     pt->p->fno = cfno;
  226.     pt->p->top = xxp;
  227.     if(mode == NEND) pt->p->tail = xxp;
  228.     tbl_set(p_tail);
  229.     if(p && p_tail->p->fno == cfno) p_tail->p->tail = xxp;
  230.     if(p == grp) pt->grp = pt;
  231.     else {
  232.         for(w=p_tail;w;w=w->back) {
  233.             if(w->count != grp+1) continue;
  234.             pt->grp = w;
  235.             break;
  236.         }
  237.     }
  238.     tbl_set(pt);
  239.     _fstrcpy(pt->p->title,(char far *)buf);
  240.     if(strlen(niftyid)) _fmemcpy(pt->p->nifid,niftyid,8);
  241.     else                 _fstrcpy(pt->p->nifid,"ID");
  242.     if(!p_tail) {
  243.         p_top = p_head = p_tail = pt;
  244.     }
  245.     else {
  246.         p_tail->next = pt;
  247.         pt->back = p_tail;
  248.         p_tail = pt;
  249.     }
  250.     p++;
  251.     xnstatus();
  252.     linecount=1;
  253.     jumpon = 0;
  254.     if(titlecountr > 0)
  255.         titlecountr--;
  256.     switch(mode) {
  257.     case NTOP:
  258.     case NNEWSHEAD:
  259.     case NBBSHEAD:
  260.     case NCBHEAD:
  261.     case NNOTEHEAD:
  262.     case NMEMBERHEAD:
  263.     case NINFOHEAD:
  264.     case NETC:
  265.         forumon = 0;
  266.         break;
  267.     case NFORUMHEAD:
  268.     case NPATIOHEAD:
  269.         forumon = 1;
  270.         break;
  271.     case NMAILHEAD:
  272.         forumon = 2;
  273.         break;
  274.     }
  275.     return(0);
  276. }
  277.  
  278. static int setpoint2(char mode,char *buf) /* タイトルテーブル作成 */
  279. {
  280.     return(setpoint(mode,p,buf));
  281. }
  282.  
  283. static int setpoint3(char mode,char *buf) /* タイトルテーブル作成 */
  284. {
  285.     return(setpoint(mode,gp,buf));
  286. }
  287.  
  288. static int setpoint4(char mode,char *buf) /* 同じタイトルは出力しない */
  289. {
  290.     if(!p_tail || p_tail->mode != mode)
  291.         return(setpoint(mode,p,buf));
  292.     return(0);
  293. }
  294.  
  295. static void nifidsetsub(char *work)
  296. {
  297.     tbl_set(p_tail);
  298.     _fmemcpy(p_tail->p->nifid,(char far *)work,8);
  299. }
  300.  
  301. static void nifidset(char *buf) /* フォーラム名セット */
  302. {
  303.     char work[9];
  304.  
  305.     tbl_set(p_tail);
  306.     p_tail->p->cno = fmeslibno;
  307.     if(strlen(buf)) {
  308.         xxstrncpy(work,buf,8);
  309.         nifidsetsub(work);
  310.     }
  311.     else nifidsetsub("FORUM");
  312. }
  313.  
  314. static int hpout(void)    /* HP出力 */
  315. {
  316.     char msg[128];
  317.  
  318.     sprintf(msg," ☆ HP %s:%s",hpid,hpmsg);
  319.     if(setpoint2(NHPHEAD,msg)) return(1);
  320.     nmode=NHP;
  321.     if(!strlen(hpid)) strcpy(hpid,"HP");
  322.     nifidset(hpid);
  323.     hpid[0] = 0;
  324.     preno = 0;
  325.     return(0);
  326. }
  327.  
  328. static int patioout(void)    /* パティオ出力 */
  329. {
  330.     char msg[128];
  331.  
  332.     sprintf(msg," ☆ パティオ :%s",patioid);
  333.     if(setpoint2(NPATIOHEAD,msg)) return(1);
  334.     strcpy(forumname,patioid);
  335.     nmode=NPATIO;
  336.     nifidset(patioid);
  337.     patioid[0] = 0;
  338.     preno = 0;
  339.     return(0);
  340. }
  341.  
  342. static int heyaout(void)    /* 会議室出力 */
  343. {
  344.     char *a,buf[81];
  345.     long savexp,savexplno,xp;
  346.  
  347.     if(strlen(forummsg)) {
  348.         if(a = strrchr(forummsg,' ')) {
  349.             a++;
  350.             xxstrncpy(forumname,a,19);
  351.         }
  352.         if(setpoint2(NFORUMHEAD,forummsg)) return(1);
  353.         nifidset(forumname);
  354.         if(forum3msgp) {
  355.             savexp = xxp;
  356.             savexplno = xxplno;
  357.             xxp = forum3msgp;
  358.             xxplno = forum3lno;
  359.             xp = xftell();
  360.             xfseek(forum3msgp);
  361.             xfgets(buf,81);
  362.             rtncut(buf);
  363.             xfseek(xp);
  364.             if(setpoint3(NFORUM2,buf)) return(1);
  365.             nifidset(forumname);
  366.             xxp = savexp;
  367.             xxplno = savexplno;
  368.             forum3msgp = 0;
  369.         }
  370.         nmode=NFORUM;
  371.         forummsg[0] = 0;
  372.     }
  373.     memset(saveheya,0,3);
  374.     return(0);
  375. }
  376.  
  377. static int libnoout(void)    /* データライブラリ出力 */
  378. {
  379.     char msg[81];
  380.  
  381.     sprintf(msg,"- %s  LIB(%2d):%s",forumname,fmeslibno,libtno[fmeslibno-1]);
  382.     if(setpoint2(NLIBHEAD,msg)) return(1);
  383.     nifidset(forumname);
  384.     nmode=NLIBNO;
  385.     return(0);
  386. }
  387.  
  388. static char *logck_1[] = {
  389.     "MEMBER",
  390.     "MAIL",
  391.     "BBS",
  392.     "BOARD",
  393.     "MYFORUM",
  394.     "CB",
  395.     "HELLO",
  396.     "TOP",
  397.     "T",
  398.     "TT",
  399.     "NIF",
  400.     "FORUM",
  401.     "OFF",
  402.     "BYE",
  403.     "LOG",
  404.     (char *)0
  405. };
  406.  
  407. static char *logck_2[] = {
  408.     "COM",
  409.     "COMP",
  410.     "WRITE",
  411.     "SAY",
  412.     "ANN",
  413.     "BUL",
  414.     "RTC",
  415.     "OPT",
  416.     "E"
  417.     "?",
  418.     "MEM",
  419.     "RVL",
  420.     "SDL",
  421.     (char *)0
  422. };
  423.  
  424. static char *logck2_1[] = {
  425.     "LIB",
  426.     "MES",
  427.     "CCS(",
  428.     "PATIO(",
  429.     "RX",
  430.     "DL",
  431.     "DIR",
  432.     "HELP",
  433.     "UST",
  434.     (char *)0
  435. };
  436.  
  437. static int logcheck1(char *buf,char *ck[])
  438. {
  439.     char *s,*d;
  440.     int i;
  441.  
  442.     for(i=0;ck[i];i++) {
  443.         s = buf;
  444.         d = ck[i];
  445.         while(*s == *d) {
  446.             if(!*d) return(0);
  447.             s++;
  448.             d++;
  449.         }
  450.     }
  451.     return(1);
  452. }
  453.  
  454. static int logcheck2(char *buf,char *ck[])
  455. {
  456.     char *s,*d;
  457.     int i;
  458.  
  459.     for(i=0;d=ck[i];i++) {
  460.         s = buf;
  461.         while(*s == *d) {
  462.             if(!*d) return(0);
  463.             s++;
  464.             d++;
  465.             if(!*d) return(0);
  466.         }
  467.     }
  468.     return(1);
  469. }
  470.  
  471. static int jumpcheck(char *buf)    /* ジャンプコマンド検出 */
  472. {
  473.     int i,j;
  474.     char *a,b[81],c;
  475.     long xp;
  476.  
  477.     if(!xstrncmp(buf,"ID (改行の")) {
  478.         hpmsg[0] = 0;
  479.         strcpy(hpid,niftyid);
  480.         return(1);
  481.     }
  482.     if(!xstrncmp(buf,"ID(改行で終了)")) {
  483.         xp = xftell();
  484.         if(!xfgets(b,81)) return(0);
  485.         rtncut(b);
  486.         xfseek(xp);
  487.         if(!xstrncmp(b,":") && isascii(b[2]) && isdigit(b[9])) {
  488.             xxstrncpy(profid,&b[2],8);
  489.             submode = SPROF;
  490.         }
  491.         return(0);
  492.     }
  493.     if(!xstrncmp(buf,"---/ ") && strstr(buf,"/---------")) {
  494.         if(isascii(buf[5]) && isdigit(buf[8])) {
  495.             xxstrncpy(niftyid,&buf[5],8);
  496.         }
  497.         return(3);
  498.     }
  499.     if(!xstrncmp(buf,">")) {
  500.         a = &buf[2];
  501.     }
  502.     else if(*buf == '>') {
  503.         a = &buf[1];
  504.     }
  505.     else if(((c=buf[0]) >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z')) {
  506.         c = buf[10];
  507.         buf[10] = 0;
  508.         a = strchr(buf,'>');
  509.         buf[10] = c;
  510.         if(a) a++;
  511.         else  return(0);
  512.     }
  513.     else return(0);
  514.     if(!*a || iskanji(*a)) return(0);
  515.     for(i = j = 0; a[i] != 0; i++) {
  516.         if(a[i] == '\t') b[j++] = ' ';
  517.         else             b[j++] = toupper(a[i]);
  518.     }
  519.     b[j] = 0;
  520.  
  521.     if(!xstrncmp(b,"LIB ")) a = &b[4];
  522.     else if(!xstrncmp(b,"DL ") || !xstrncmp(b,"RX ")) a = &b[3];
  523.     else if(!xstrncmp(b,"MES ")) a = &b[4];
  524.     else if(!xstrncmp(buf,">") && !fmeslibno) {
  525.         a = &b[0];
  526.     }
  527.     else a = buf;
  528.     if(a != buf) {
  529.         if(i = bytedec(a))
  530.             fmeslibno = i;
  531.     }
  532.     if(i = bytedec(b) && strlen(b) <= 2)
  533.         return(1);
  534.  
  535.     if(!xstrncmp(buf,"HP>")) {
  536.         submode = 0;
  537.         passflag = 0;
  538.     }
  539.     if(!xstrncmp(buf,"MAIL>")) {
  540.         passflag = 0;
  541.     }
  542.     if(!xstrncmp(b,"GO "))
  543.         return(2);
  544.     if(!logcheck1(b,logck_1))
  545.         return(2);
  546.     if(!xstrncmp(b,"MOV")) {
  547.         if(strlen(b) > 8) {
  548.             if(b[3] == 'E') a = &b[5];
  549.             else            a = &b[4];
  550.             hpmsg[0] = 0;
  551.             xxstrncpy(hpid,a,8);
  552.         }
  553.         return(2);
  554.     }
  555.     if(!xstrncmp(buf,"HP>GUE")) {
  556.         submode = SGUEST;
  557.         passflag = 0;
  558.         return(0);
  559.     }
  560.     if(!xstrncmp(buf,"HP>TIT")) {
  561.         submode = STITLE;
  562.         passflag = 0;
  563.         return(0);
  564.     }
  565.     if(!xstrncmp(buf,">GUE"))
  566.         return(3);
  567.     if(!forumon && (!xstrncmp(b,"SMAIL") || !xstrncmp(b,"SENDMAIL"))) {
  568.         forumon = 2;
  569.         return(2);
  570.     }
  571.     if(!xstrncmp(buf,">OPT") || !logcheck1(b,logck_2)
  572.      || !logcheck2(b,logck2_1))
  573.         return(1);
  574.     if(!xstrncmp(b,"PROF ") && isascii(b[5]) && isdigit(b[8]) && !b[13]) {
  575.         xxstrncpy(profid,&b[5],8);
  576.         submode = SPROF;
  577.     }
  578.     return(0);
  579. }
  580.  
  581. static void meslibclr(char *buf)
  582. {
  583.     int i;
  584.  
  585.     for(i = 0;i < 20; i++)
  586.         mestno[i][0] = libtno[i][0] = 0;
  587.     fmeslibno = 0;
  588.     xxstrncpy80(forummsg,buf);
  589. }
  590.  
  591. static int stagecheck(char *buf)    /* フェーズ切り換え行検出 */
  592. {
  593.     char *a,buf1[81];
  594.     int i;
  595.  
  596.     if(iskanji(*buf)) {
  597.         if(!xstrncmp(buf," "))
  598.             return(0);
  599.         if(!xstrncmp(buf,"オプション (1:"))
  600.             return(NOPT);
  601.         if(!xstrncmp(buf,"<タイトル一") || !xstrncmp(buf,"<メッセージタイ"))
  602.             return(NFRT);
  603.         if(!xstrncmp(buf,"<発言検索"))
  604.             return(NFRS);
  605.         if(!xstrncmp(buf,"番号 発言 (未"))
  606.             return(NMES);
  607.         if(!xstrncmp(buf,"開始番号 (改行"))
  608.             return(NMEMBER);
  609.         if(!xstrncmp(buf,"項目(改行のみ"))
  610.             return(NETC);
  611.         if(!xstrncmp(buf,"番号 総数 登録"))
  612.             if((!p_tail || p_tail->mode != NFORUM) || jumpon)
  613.                 return(NLIB);
  614.         if(!xstrncmp(buf,"番号  ID")) {
  615.             if((!p_tail || p_tail->mode != NFORUM) || jumpon)
  616.                 return(NLIBNO);
  617.             return(0);
  618.         }
  619.         if(!xstrncmp(buf,"ようこそNIFTY")
  620.          || !xstrncmp(buf,"前回LOG O")) {
  621.             return(NINIT);
  622.         }
  623.         if(!xstrncmp(buf,"ニュース速報") || !xstrncmp(buf,"☆フラッシュ")
  624.          || !xstrncmp(buf,"☆共同金融経")) {
  625.             return(NSINBUN);
  626.         }
  627.         if(!xstrncmp(buf,"番号  登録者") || !xstrncmp(buf,"掲示板    BBS")) {
  628.             if(forumon != 1) return(NBBS);
  629.             return(NFBBS);
  630.         }
  631.         if(!xstrncmp(buf,"電子メール(1:"))
  632.             return(NMAIL);
  633.         if(!xstrncmp(buf,"番号  提供日")
  634.          || !xstrncmp(buf,"オンライン・ト")) {
  635.             if(forumon != 1) return(NNOTE);
  636.             return(NFNEWS);
  637.         }
  638.         if(!xstrcmp(buf,"今週のお知らせ    NEW"))
  639.             return(NNEWS);
  640.         if(!xstrncmp(buf,"FM情報サ") || !xstrncmp(buf,"**  情報センター ")) {
  641.             meslibclr(buf);
  642.             return(NFORUM);
  643.         }
  644.          if(!xstrncmp(buf,"課金情報 (1:") || !xstrncmp(buf,"課金情報    B")
  645.          || !xstrncmp(buf,"年/月   回数  時"))
  646.             return(NBILL);
  647.         if(!xstrncmp(buf,"ハンドルネームとタ")) {
  648.             return(NHPWRITE);
  649.         }
  650.         if(!xstrncmp(buf,"本文(300 行") || !xstrncmp(buf,"本文 (300行")) {
  651.             if(forumon == 1) return(NFWRITE);
  652.             if(forumon == 2) return(NMWRITE);
  653.             return(NWRITE);
  654.         }
  655.         if(!xstrncmp(buf,"-リアルタイム")) {
  656.             passflag = 1;
  657.             return(NFRTIME);
  658.         }
  659.         if(!xstrncmp(buf,"会員情報(1:パス"))
  660.             return(NMEMBER);
  661.         if(!xstrcmp(buf,"番号  題名"))
  662.             return(NINFO);
  663.         if(strstr(buf," W")) {
  664.             if(!xstrncmp(buf,"天気予報") || !xstrncmp(buf,"おでかけ天")
  665.              || !xstrncmp(buf,"全国都市予報") || !xstrncmp(buf,"ゴルフ天")
  666.              || !xstrncmp(buf,"海釣り天")
  667.              || !xstrncmp(buf,"ウィンドサーフィン天")
  668.              || !xstrncmp(buf,"世界の都市予報"))
  669.                 return(NTENKI);
  670.         }
  671.         if(!xstrncmp(buf,"番号 送信者"))
  672.             return(NMRCV);
  673.         if(!xstrncmp(buf,"送信日  受信"))
  674.             return(NSDL);
  675.         if(!xstrncmp(buf,"受信日  送信"))
  676.             return(NRCL);
  677.         if(!xstrncmp(buf,"アクセス・ギ"))
  678.             return(NETC);
  679.         if(!xstrncmp(buf,"貴方は以下のフォーラム"))
  680.             return(NMYFORUM);
  681.         if(!xstrncmp(buf,":") && strlen(buf) == 10
  682.          && isalpha(buf[2]) && isdigit(buf[5])
  683.          && !xstrncmp(savebuf,"ID (改行のみ:自分のパティオ")) {
  684.             xxstrncpy(patioid,&buf[2],8);
  685.             return(NPATIO);
  686.         }
  687.         if(!xstrncmp(buf,">GUE")) {
  688.             return(NPGUEST);
  689.         }
  690.         for(i=0;i < MAXMSGNO && msgstrtbl[i];i++) {
  691.             _fstrcpy((char far *)buf1,msgstrtbl[i]);
  692.             if(!xstrncmp(buf,&buf1[1])) {
  693.                 if(!forum3msgp) {
  694.                     forum3msgp = xxp;
  695.                     forum3lno = xxplno;
  696.                 }
  697.             }
  698.         }
  699.     }
  700.     else {
  701.         if(!xstrncmp(buf," #  Total#(unr"))
  702.             return(NMES);
  703.         if(!xstrncmp(buf," Enter User")) {
  704.             memset(niftyid,0,9);
  705.             if(a = strchr(buf,'>'))
  706.                 strncpy(niftyid,&a[1],8);
  707.             return(NINIT);
  708.         }
  709.         if(!xstrncmp(buf,"Welcome to NIF"))
  710.             return(NINIT);
  711.         if(!xstrncmp(buf,"NIFTY-Serve     TOP")
  712.          || !xstrncmp(buf,"NIFTY-Serve ES    TOP")) {
  713.             return(NTOP);
  714.         }
  715.         if(!xstrncmp(buf,"MAIL>") || !xstrncmp(buf,"Mail (1:")) {
  716.             return(NMAIL);
  717.         }
  718.         if(!xstrncmp(buf,"NEWS>"))
  719.             return(NNEWS);
  720.         if(!xstrncmp(buf,"1:お知ら") || !xstrncmp(buf,"*:お知ら")
  721.          || !xstrncmp(buf,"1:フォーラム概")) {
  722.             if(!xstrncmp(savebuf,"<") || *savebuf == '<') {
  723.                 meslibclr(savebuf);
  724.                 return(NFORUM);
  725.             }
  726.         }
  727.         if(!xstrncmp(buf,"FORUM>") || !xstrncmp(buf,"1:Announcements")) {
  728.             if(!xstrncmp(savebuf,"<") || *savebuf == '<') {
  729.                 meslibclr(savebuf);
  730.                 return(NFORUM);
  731.             }
  732.         }
  733.         if(!xstrncmp(buf," ☆ HP ")) {
  734.             xxstrncpy(hpmsg,&buf[18],62);
  735.             xxstrncpy(hpid,&buf[9],8);
  736.             return(NHP);
  737.         }
  738.         if(!xstrncmp(buf," ☆ パティオ ")) {
  739.             xxstrncpy(patioid,&buf[14],8);
  740.             return(NPATIO);
  741.         }
  742.          if(!xstrncmp(buf,"BILL>"))
  743.             return(NBILL);
  744.         if(!xstrncmp(buf,"CBシミュレ") || !xstrncmp(buf,"CB>")
  745.          || !xstrncmp(buf,"*Welcome to CB")) {
  746.             passflag = 1;
  747.             return(NCB);
  748.         }
  749.         if(!xstrncmp(buf,"        LOG IN "))
  750.             return(NBYE);
  751.         if(!xstrncmp(buf,"HP>")) {
  752.             if(!strlen(hpmsg))
  753.                 xxstrncpy(hpmsg,savebuf,62);
  754.             return(NHP);
  755.         }
  756.         if(!xstrncmp(buf,"ID        Name ("))
  757.             return(NMEMBER);
  758.         if(!xstrncmp(buf,"---/ Sent "))
  759.             return(NM2WRITE);
  760.     }
  761.     return(0);
  762. }
  763.  
  764. static int stageset(int smode,long xp,long xplno)    /* タイトル出力 */
  765. {
  766.     char msg[81];
  767.     int i;
  768.     long savexp,savexplno;
  769.  
  770.     savexp = xxp;
  771.     savexplno = xxplno;
  772.     xxp = xp;
  773.     xxplno = xplno;
  774.     switch(smode) {
  775.     case NINIT:
  776.         strcpy(msg,initial);
  777.         if(strlen(niftyid))
  778.             strcat(msg,niftyid);
  779.         if(setpoint4(NINIT,msg)) return(1);
  780.         break;
  781.     case NTOP:
  782.         if(setpoint4(NTOP,toptitle)) return(1);
  783.         break;
  784.     case NBBS:
  785.         if(setpoint4(NBBSHEAD,bbstitle)) return(1);
  786.         break;
  787.     case NNEWS:
  788.         if(setpoint4(NNEWSHEAD,newstitle)) return(1);
  789.         break;
  790.     case NFBBS:
  791.         sprintf(msg,"- %s  BBS:掲示版",forumname);
  792.         if(setpoint2(NFBBSHEAD,msg)) return(1);
  793. stage_00:
  794.         nifidset(forumname);
  795.         break;
  796.     case NFNEWS:
  797.         sprintf(msg,"- %s  NEWS:お知らせ",forumname);
  798.         if(setpoint2(NFNEWSHEAD,msg)) return(1);
  799.         goto stage_00;
  800.     case NNOTE:
  801.         if(setpoint4(NNOTEHEAD,notetitle)) return(1);
  802.         break;
  803.     case NSINBUN:
  804.         if(setpoint4(NSINBUNHEAD,sinbuntitle)) return(1);
  805.         break;
  806.     case NMAIL:
  807.         strcpy(msg,mailtitle);
  808.         strcat(msg,niftyid);
  809.         if(setpoint4(NMAILHEAD,msg)) return(1);
  810.         break;
  811.     case NHP:
  812.         if(hpout()) return(1);
  813.         break;
  814.     case NPATIO:
  815.         if(patioout()) return(1);
  816.         break;
  817.     case NFORUM:
  818.         if(heyaout()) return(1);
  819.         break;
  820.     case NBILL:
  821.         strcpy(msg,billtitle);
  822.         strcat(msg,niftyid);
  823.         if(setpoint2(NBILLHEAD,msg)) return(1);
  824.         break;
  825.     case NCB:
  826.         if(setpoint2(NCBHEAD,cbtitle)) return(1);
  827.         break;
  828.     case NMEMBER:
  829.         if(setpoint4(NMEMBERHEAD,membertitle)) return(1);
  830.         break;
  831.     case NMES:
  832.         sprintf(msg,"# %s  MES < 会議室 >",forumname);
  833.         for(i = 0;i < 20; i++)
  834.             mestno[i][0] = 0;
  835.         fmeslibno = 0;
  836.         if(setpoint2(NMESNOHEAD,msg)) return(1);
  837.         goto stage_00;
  838.     case NLIB:
  839.         sprintf(msg,"# %s  LIB < データライブラリ >",forumname);
  840.         for(i = 0;i < 20; i++)
  841.             libtno[i][0] = 0;
  842.         fmeslibno = 0;
  843.         if(setpoint2(NLIBNOHEAD,msg)) return(1);
  844.         goto stage_00;
  845.     case NBYE:
  846.         strcpy(msg,byetitle);
  847.         strcat(msg,niftyid);
  848.         if(setpoint4(NBYEHEAD,msg)) return(1);
  849.         memset(niftyid,0,9);
  850.         break;
  851.     case NFRT:
  852.         sprintf(msg,"- %s  MES(%2d) < タイトル一覧 >",forumname,fmeslibno);
  853.         if(setpoint2(NFRTHEAD,msg)) return(1);
  854.         goto stage_00;
  855.     case NFRS:
  856.         sprintf(msg,"- %s  MES(%2d) < 発言検索 >",forumname,fmeslibno);
  857.         if(setpoint2(NFRSHEAD,msg)) return(1);
  858.         goto stage_00;
  859.     case NLIBNO:
  860.         libnoout();
  861.         break;
  862.     case NFRTIME:
  863.         sprintf(msg,"- %s  RTC:リアルタイム会議",forumname);
  864.         if(setpoint2(NFRTIMEHEAD,msg)) return(1);
  865.         goto stage_00;
  866.     case NINFO:
  867.         if(setpoint4(NINFOHEAD,infotitle)) return(1);
  868.         break;
  869.     case NTENKI:
  870.         if(setpoint4(NTENKI,tenkititle)) return(1);
  871.         break;
  872.     case NMRCV:
  873.         if(setpoint2(NMRCVHEAD,mrcvtitle)) return(1);
  874.         break;
  875.     case NSDL:
  876.         if(setpoint2(NSDLHEAD,sdltitle)) return(1);
  877.         break;
  878.     case NRCL:
  879.         if(setpoint2(NRCLHEAD,rcltitle)) return(1);
  880.         break;
  881.     case NMYFORUM:
  882.         if(setpoint2(NMYFORUM,myforumtitle)) return(1);
  883.         break;
  884.     case NOPT:
  885.         sprintf(msg,"- %s  OPT:オプション設定",forumname);
  886.         if(setpoint4(NOPTHEAD,msg)) return(1);
  887.         goto stage_00;
  888.     default:
  889.         if(setpoint2(NETC,etctitle)) return(1);
  890.         break;
  891.     }
  892.     xxp = savexp;
  893.     xxplno = savexplno;
  894.     return(0);
  895. }
  896.  
  897. static int heyasepa(void)    /* 会議室区切り出力 */
  898. {
  899.     char msg[81],*a;
  900.     int i;
  901.     long savexp,savexplno;
  902.  
  903.     savexp = xxp;
  904.     savexplno = xxplno;
  905.     xxp = savepp;
  906.     xxplno = savepplno;
  907.     strcpy(msg,savebuf);
  908.      if(!xstrncmp(savebuf,"- MES(")) {    /* "- MES(xx) ・・・・" */
  909.         if(strlen(forumname)) {
  910.             sprintf(msg,"- %s ",forumname);
  911.             strncat80(msg,&savebuf[1]);
  912.         }
  913.         fmeslibno = bytedec(&savebuf[6]);
  914.      }
  915.      else if(!xstrncmp(savebuf,"-room# : ")) {    /* "-room# : xx・・・" */
  916.         if(strlen(forumname)) {
  917.             sprintf(msg,"- %s  MES(",forumname);
  918.             strncat80(msg,&savebuf[9]);
  919.         }
  920.         fmeslibno = bytedec(&savebuf[9]);
  921.      }
  922.      else if(!xstrncmp(savebuf,"- ") || !xstrncmp(savebuf,"<< 会議")) {
  923.          if(a=strchr(savebuf,'('))
  924.             fmeslibno = bytedec(a+1);
  925.     }
  926.      else if(!xstrncmp(savebuf,"-会議室")) {
  927.         if(strlen(forumname)) {
  928.             sprintf(msg,"- %s  MES(%c%c):",forumname,savebuf[8],savebuf[9]);
  929.             strncat80(msg,&savebuf[12]);
  930.         }
  931.         fmeslibno = bytedec(&savebuf[8]);
  932.      }
  933.     else {
  934.         if(i=bytedec(heya))
  935.             fmeslibno = i;
  936.         sprintf(msg,"- %s  MES(%2d):%s",forumname,fmeslibno,mestno[fmeslibno-1]);
  937.         xxp = savexp;
  938.         xxplno = savexplno;
  939.     }
  940.     if(setpoint2(NMESHEAD,msg)) return(1);
  941.     nifidset(forumname);
  942.     xxp = savexp;
  943.     xxplno = savexplno;
  944.     nmode = NFORUM;
  945.     return(0);
  946. }
  947.  
  948. static int headcheck(char mode)
  949. {
  950.     long xp,xplno;
  951.  
  952.     if(nmode != mode) {
  953.         gp = p;
  954.         xp = xxp;
  955.         xplno = xxplno;
  956.         if(jumpon) {
  957.             xp = jpp;
  958.             xplno = jpplno;
  959.             jumpon = 0;
  960.         }
  961.         if(stageset(mode,xp,xplno)) return(1);
  962.         nmode = mode;
  963.     }
  964.     if(jumpon) jumpon = 0;
  965.     return(0);
  966. }
  967.  
  968. char savehpread=0;
  969. static int lineread(char *buf)    /* 一行読み込み */
  970. {
  971.     memset(buf,0,81);
  972.     if(savehpread) {
  973.         buf[0] = savehpread;
  974.         savehpread = 0;
  975.         if(!xfgets(&buf[1],80))    return(1);
  976.     }
  977.     else if(!xfgets(buf,81))    return(1);
  978.     if(strlen(buf) == 80 && nthctype(buf,79) == CT_KJ1) {
  979.         savehpread = buf[79];
  980.         buf[79] = 0;
  981.     }
  982.     if(!rtncut(buf))
  983.         p_linecount--;
  984.     return(0);
  985. }
  986.  
  987. static int ckhpsub(char *buf,int mode)
  988. {
  989.     long xp;
  990.     char buf3[81];
  991.     int i;
  992.  
  993.     xp = xftell();
  994.     if(!xfgets(buf3,81)) return(-2);
  995.     i = rtncut(buf3);
  996.     if(strlen(buf3)) {
  997.         xfseek(xp);
  998.         return(1);
  999.     }
  1000.     if(i) p_linecount++;
  1001.     if(headcheck(mode) || setpoint3(mode,buf)) return(-1);
  1002.     nifidsetsub(&buf[6]);
  1003.     return(1);
  1004. }
  1005.  
  1006. static int checklib(char *buf)     /* データライブラリチェック */
  1007. {
  1008.     if(p_tail && p_tail->mode == NFORUM && !jumpon)
  1009.         return(0);
  1010.     if(!xstrncmp(buf,"データ名:"))
  1011.         return(1);
  1012.     if(isdigit(buf[3]) && buf[4] == ' ' && buf[5] == ' '
  1013.      && isdigit(buf[9]) && isdigit(buf[13]) && buf[23] == 'B'
  1014.      && buf[24] == 'y' && buf[25] == 't')    /* ブラウザ機能 */
  1015.         return(1);
  1016.     return(0);
  1017. }
  1018.  
  1019. static int checkhpsub(char *buf)    /* タイトル検出サブ */
  1020. {
  1021.     long xp,wp;
  1022.     char buf3[81],*a;
  1023.     int i,j;
  1024.  
  1025.      if(!xstrncmp(buf,"-会議室") && strncmp(&buf[8],&saveheya[0],2)) {
  1026.         gp = p;
  1027.         if(!strlen(forumname))
  1028.             strcpy(buf3,buf);
  1029.         else {
  1030.             sprintf(buf3,"- %s  MES(%c%c):",forumname,buf[8],buf[9]);
  1031.             strncat80(buf3,&buf[12]);
  1032.         }
  1033.         fmeslibno = bytedec(&buf[8]);
  1034.         if(setpoint2(NMESHEAD,buf3)) return(-1);
  1035.         nifidset(forumname);
  1036.         nmode = NFORUM;
  1037.         memcpy(saveheya,&buf[8],2);
  1038.         return(2);
  1039.     }
  1040.     if(p_tail && p_tail->mode == NFORUM && !jumpon)
  1041.         return(0);
  1042.     if(buf[0] == '-' && (a = strstr(buf," LIB("))) {
  1043.         a -= 2;
  1044.         if(i = bytedec(a))
  1045.             fmeslibno = i;
  1046.         gp = p;
  1047.         if(setpoint2(NLIBHEAD,buf)) return(-1);
  1048.         nifidset(forumname);
  1049.         nmode = NLIBNO;
  1050.         return(2);
  1051.     }
  1052.     if(checklib(buf)) {
  1053.         if(headcheck(NLIBNO) || setpoint3(NLIBDATA,buf))
  1054.             return(-1);
  1055.         return(1);
  1056.     }
  1057.     if(iskanji(buf[0])) {
  1058.         if(!xstrncmp(buf,":") && strlen(buf) == 10
  1059.          && isalpha(buf[2]) && isdigit(buf[5])) {
  1060.             hpmsg[0] = 0;
  1061.             xxstrncpy(hpid,&buf[2],8);
  1062.             return(1);
  1063.         }
  1064.         if(!xstrcmp(buf,":") && !xstrcmp(savebuf,"パスワード")) {
  1065.             wp = xftell();
  1066.             if(lineread(buf3)) return(-2);
  1067.             xfseek(wp);
  1068.             xxstrncpy(hpmsg,buf3,62);
  1069.             return(1);
  1070.         }
  1071.         return(0);
  1072.     }
  1073.     if(!xstrncmp(buf,"---/ ") && strstr(buf,"/-----/")    /* air craft 対応 */
  1074.      && isascii(buf[5]) && isdigit(buf[8])) {
  1075.         if(lineread(buf)) return(-2);
  1076.         p_linecount++;
  1077.     }
  1078.     if(buf[2] == ' ' && buf[34] == '/'         /* 電子メールチェック */
  1079.      && buf[40] == ':'&& isdigit(buf[1])
  1080.      && isdigit(buf[32]) && isdigit(buf[33])) {
  1081.         if(headcheck(NMAIL)) return(-1);
  1082.         wp = xftell();
  1083.         if(lineread(buf3)) return(-2);
  1084.         xfseek(wp);
  1085.         strcat(buf,"  ");
  1086.         strncat80(buf,&buf3[10]);
  1087.         if(setpoint3(NMAIL,buf)) return(-1);
  1088.         if(buf[0] != ' ') i = (buf[0]-'0') * 10;
  1089.         else              i = 0;
  1090.         i += buf[1]-'0';
  1091.         tbl_set(p_tail);
  1092.         p_tail->p->id = i;
  1093.         nifidsetsub(&buf[22]);
  1094. /*        passflag = 1; */
  1095.         return(2);
  1096.     }
  1097.     if(buf[3] == ' ' && buf[5] == ' '     /* 掲示板チェック */
  1098.      && buf[15] == ' ' && isdigit(buf[2]) && buf[28] == ' '
  1099.      && isdigit(buf[19]) && isdigit(buf[20]) && buf[18] == '/'
  1100.      && isdigit(buf[27])) {
  1101.         xp = xftell();
  1102.         if(!xfgets(buf3,81)) return(-2);
  1103.         j = rtncut(buf3);
  1104.         if(strlen(buf3) >= 2 && buf3[2] != ' ' && xstrncmp(buf3," ")) {
  1105.             xfseek(xp);
  1106.             return(0);
  1107.         }
  1108.         if(j) p_linecount++;
  1109.         if(forumon != 1) i = NBBS;
  1110.         else             i = NFBBS;
  1111.         if(headcheck(i) || setpoint3(i,buf))
  1112.             return(-1);
  1113.         if(buf[0] != ' ') i = (buf[0]-'0') * 10;
  1114.         else              i = 0;
  1115.         if(buf[1] != ' ') i = (i+buf[1]-'0') * 10;
  1116.         i += buf[2]-'0';
  1117.         tbl_set(p_tail);
  1118.         p_tail->p->id = i;
  1119.         _fmemcpy(p_tail->p->nifid,(char far *)&buf[6],8);
  1120.         return(1);
  1121.     }
  1122.     if(buf[4] == ' ' && buf[5] == ' '     /* お知らせチェック */
  1123.      && buf[8] == '/' && buf[11] == '/'
  1124.      && isdigit(buf[3]) && isdigit(buf[6]) && isdigit(buf[7])) {
  1125.         return(ckhpsub(buf,NNEWS));
  1126.     }
  1127.     if(buf[3] == ' ' && buf[4] == ' '     /* オンライン・ツゥディチェック */
  1128.      && buf[5] == ' ' && buf[8] == '/' && buf[11] == '/'
  1129.      && isdigit(buf[2]) && isdigit(buf[6]) && isdigit(buf[7])) {
  1130.         if(forumon != 1) i = NNOTE;
  1131.         else             i = NFNEWS;
  1132.         return(ckhpsub(buf,i));
  1133.     }
  1134.     if(isdigit(buf[2]) && buf[3] == ' '    /* 新聞情報チェック */
  1135.      && buf[4] == ' ' && buf[5] == ' '
  1136.      && isdigit(buf[7]) && buf[8] == '/'
  1137.      && isdigit(buf[13]) && buf[14] == ':') {
  1138.         return(ckhpsub(buf,NSINBUN));
  1139.     }
  1140.     if(nmode == NMES) {
  1141.         if(isdigit(buf[1]) && buf[2] == ' ' && buf[11] == '('
  1142.          && buf[16] == ')' && buf[22] == '/') {
  1143.             i = bytedec(buf);
  1144.             strcpy(mestno[i-1],&buf[28]);
  1145.         }
  1146.     }
  1147.     if(nmode == NLIB) {
  1148.         if(isdigit(buf[3]) && buf[4] == ' ' && buf[12] == '('
  1149.          && buf[17] == ')' && buf[22] == '/') {
  1150.             i = bytedec(&buf[2]);
  1151.             strcpy(libtno[i-1],&buf[28]);
  1152.         }
  1153.     }
  1154.     if(isdigit(buf[2]) && buf[3] == ' '    /* 情報サービスチェック */
  1155.      && buf[4] == ' ' && buf[5] == ' '
  1156.      && buf[6] != ' ' && buf[strlen(buf)-1] == ')') {
  1157.         xp = xftell();
  1158.         if(!xfgets(buf3,81)) return(-2);
  1159.         i = rtncut(buf3);
  1160.         if(strlen(buf3) > 2 && buf3[2] != ' ') {
  1161.             xfseek(xp);
  1162.             return(0);
  1163.         }
  1164.         if(i) p_linecount++;
  1165.         if(headcheck(NINFO) || setpoint3(NINFO,buf))
  1166.             return(-1);
  1167.         return(1);
  1168.     }
  1169.     return(0);
  1170. }
  1171.  
  1172. long sp = 0;
  1173. long splno = 0;
  1174. int passflag = 0;
  1175. void hpread(long count,int mode)    /* タイトルテーブル作成メイン */
  1176. {
  1177.     char buf[81],*buf2,buf3[91],bufwork[81];
  1178.     long pp=0,pplno=0,xp,xplno,wp,max=0,wmax,l;
  1179.     int no,i,j,smode=0;
  1180.     PCELL far *pt;
  1181.     long savexp,savexplno;
  1182.  
  1183.     if(pend == 2) return;
  1184.     if(mode == 1 || mode == 2) {
  1185.         max = filelength(fileno(fd));
  1186.         sprintf(buf,"ログファイル読み込み処理中(%ldByte)",max);
  1187.         grh_disp(buf,0);
  1188.     }
  1189.     if(!pend && mode != 2 && (tagmode >= 3) && !nifoutropen()) {
  1190.         if(!(midokumode & 1)) {
  1191.             wmax = filelength(fileno(nifoutfd));
  1192.             for(l=0;;) {
  1193.                 if(nifoutget()) break;
  1194.                 if(mode == 1) {
  1195.                     wp = ftell(nifoutfd);
  1196.                     if(++l > 20) {
  1197.                         grh_sub(wp,wmax);
  1198.                         l = 0;
  1199.                     }
  1200.                 }
  1201.             }
  1202.             nifoutclose(0);
  1203.             for(pt=p_top,i=1;pt;pt=pt->next,i++) {
  1204.                 if(pt->flag & FTAG) tagno++;
  1205.                 pt->count = i;
  1206.             }
  1207.             tbl_set(p_tail);
  1208.             xp = p_tail->p->tail;
  1209.             xfseek(xp);
  1210.             if(!xp || xfeof()) {
  1211.                 pend = 2;
  1212.                 return;
  1213.             }
  1214.             if(p_tail->mode == NEND) {
  1215.                 pt = p_tail;
  1216.                 p_tail = pt->back;
  1217.                 p_tail->next = 0;
  1218.                 p--;
  1219.                 i--;
  1220.                 tbl_free(pt);
  1221.             }
  1222.             tbl_set(p_tail);
  1223.             xfseek(p_tail->p->top);
  1224.             for(l=0,pp=xftell();;) {
  1225.                 if(lineread(buf)) break;
  1226.                 if(xftell() >= xp) break;
  1227.                 l++;
  1228.                 pp=xftell();
  1229.             }
  1230.             xfseek(pp);
  1231.             p_linecount = pplno = p_tail->p->lineno + l;
  1232.             count -= i-1;
  1233.             jumpon = 0;
  1234.             jpp = pp;
  1235.             jpplno = pplno;
  1236.             preno = p_tail->p->id;
  1237.             forum3msgp = 0;
  1238.             saveheya[0] = 'X';
  1239.             nmode = p_tail->mode;
  1240.             switch(nmode) {
  1241.             case NMAIL:
  1242.             case NMWRITE:
  1243.             case NMRCV:
  1244.             case NSDL:
  1245.             case NRCL:        forumon = 2;
  1246.                             nmode = NMAIL; break;
  1247.             case NHPWRITE:
  1248.             case NHPHEAD:
  1249.             case NTITLE:
  1250.             case NGUEST:    nmode = NHP; break;
  1251.             case NFORUM:
  1252.             case NFWRITE:
  1253.             case NMESHEAD:
  1254.             case NFORUMHEAD:
  1255.             case NFORUM2:
  1256.             case NPGUEST:    forumon = 1;
  1257.                             nmode = NFORUM; break;
  1258.             case NLIBHEAD:    nmode = NLIBNO; break;
  1259.             case NPATIOHEAD: nmode = NPATIO; break;
  1260.             }
  1261.         }
  1262.         else {
  1263.             nifoutclose(0);
  1264.         }
  1265.     }
  1266.     pend = 1;
  1267.     if(sp) {
  1268.         xfseek(sp);
  1269.         strcpy(buf,savebuf);
  1270.         pp = savepp;
  1271.         pplno = savepplno;
  1272.         p_linecount = splno;
  1273.     }
  1274.     else buf[0] = 0;
  1275.     titlecountr = count;
  1276.     for(l=0;p < MAXPOINT-1;) {
  1277.         if(!titlecountr)
  1278.             return;
  1279.         if(mode == 3 && keycheck())
  1280.         if(keycheck())
  1281.             return;
  1282.         xxstrncpy(savebuf,buf,80);
  1283.         savepp = pp;
  1284.         pp = xftell();
  1285.         savepplno = pplno;
  1286.         pplno = p_linecount;
  1287.         if(lineread(buf)) goto hpend;
  1288.         p_linecount++;
  1289.         splno = p_linecount;
  1290.         sp = xftell();
  1291.         if(mode == 1 || mode == 2) {
  1292.             if(++l > 200) {
  1293.                 grh_sub(pp,max);
  1294.                 l = 0;
  1295.             }
  1296.         }
  1297.         if(strlen(buf) < 3) continue;
  1298. hpread_top:
  1299.         if((i = jumpcheck(buf))) {
  1300.             passflag = 0;
  1301.             if(!jumpon) {
  1302.                 jumpon = 1;
  1303.                 jpp = pp;
  1304.                 jpplno = pplno;
  1305.                 if(i != 3) continue;
  1306.             }
  1307.             else {
  1308.                 if(i == 2 && !stagecheck(buf)) {
  1309.                     jpp = pp;
  1310.                     jpplno = pplno;
  1311.                 }
  1312.             }
  1313.         }
  1314.         xxp = pp;
  1315.         xxplno = pplno;
  1316.         if((!passflag || passmode) && (smode = stagecheck(buf))) {
  1317.             if(smode != NFORUM) forum3msgp = 0;
  1318.             xp = pp;
  1319.             xplno = pplno;
  1320.             if(jumpon) {
  1321.                 xp = jpp;
  1322.                 xplno = jpplno;
  1323.                 jumpon = 0;
  1324.             }
  1325.             else if(nmode == smode && submode != SGUEST && submode != STITLE)
  1326.                 continue;
  1327.             xxp = xp;
  1328.             xxplno = xplno;
  1329.             if(smode == NM2WRITE) {
  1330.                 if(lineread(buf3)) goto hpend;
  1331.                 p_linecount++;
  1332.                 smode = NMWRITE;
  1333.             }
  1334.             if(smode == NHPWRITE || smode == NFWRITE
  1335.              || smode == NMWRITE || smode == NWRITE) {
  1336.                 wp = xftell();
  1337.                 strcpy(buf,writetitle);
  1338.                 if(lineread(buf3)) goto hpend;
  1339.                 if(smode == NMWRITE) {
  1340.                     if(headcheck(NMAIL)) break;
  1341.                     xxp = pp;
  1342.                     xxplno = pplno;
  1343.                     strcat(buf3,"  ");
  1344.                     strncat80(buf,buf3);
  1345.                     if(lineread(buf3)) goto hpend;
  1346.                 }
  1347.                 xfseek(wp);
  1348.                 strncat80(buf,buf3);
  1349. /*                savexp = xxp;
  1350.                 savexplno = xxplno;
  1351.                 xxp = xp;
  1352.                 xxplno = xplno; */
  1353.                 if(setpoint3(smode,buf)) break;
  1354. /*                xxp = savexp;
  1355.                 xxplno = savexplno; */
  1356. /*                nmode = smode;    */
  1357.                 if((buf2=strstr(buf,"TO:")) && (strlen(&buf2[3]) >= 8))
  1358.                     nifidsetsub(&buf2[3]);
  1359.             }
  1360.             else if(smode == NPGUEST) {
  1361.                 if(setpoint3(NPGUEST,guesttitle)) break;
  1362.                 nmode = NFORUM;
  1363.             }
  1364.             else {
  1365.                 if(submode == SGUEST) {
  1366.                     if(!p_tail || (p_tail->mode != NHPHEAD && strlen(hpid))) {
  1367.                         gp = p;
  1368.                         if(hpout()) break;
  1369.                         xxp = pp;
  1370.                         xxplno = pplno;
  1371.                     }
  1372.                     if(setpoint3(NGUEST,guesttitle)) break;
  1373.                     nmode = NHP;
  1374.                     submode = 0;
  1375.                 }
  1376.                 else if(submode == STITLE) {
  1377.                     if(!p_tail || (p_tail->mode != NHPHEAD && strlen(hpid))) {
  1378.                         gp = p;
  1379.                         if(hpout()) break;
  1380.                         xxp = pp;
  1381.                         xxplno = pplno;
  1382.                     }
  1383.                     if(setpoint3(NTITLE,titlehptitle)) break;
  1384.                     nmode = NHP;
  1385.                 }
  1386.                 else {
  1387.                     gp = p;
  1388.                     if(stageset(smode,xp,xplno)) break;
  1389.                     switch(smode) {
  1390.                     case NMRCV:
  1391.                     case NSDL:
  1392.                     case NRCL:
  1393.                             smode = NMAIL;
  1394.                     }
  1395.                     nmode = smode;
  1396.                     if(jumpcheck(buf))
  1397.                         goto hpread_top;
  1398.                 }
  1399.             }
  1400.             continue;
  1401.         }
  1402.         if(submode == SPROF) {
  1403.             strcpy(buf,"## 会員情報 ## :");
  1404.             strncat(buf,profid,8);
  1405.             if(setpoint2(NPROF,buf)) break;
  1406.             nmode = NPROF;
  1407.             nifidsetsub(profid);
  1408.             submode = 0;
  1409.             continue;
  1410.         }
  1411.         if((isdigit(buf[0]) && isdigit(buf[1])  /* 会議室チェック */
  1412.          && isdigit(buf[2])) && ((!xstrncmp(&buf[18],"  ")
  1413.          && buf[3] == '/' && !xstrncmp(&buf[7],"   "))
  1414.          || (!xstrncmp(&buf[11]," ") && buf[5] == '/'
  1415.          && !xstrncmp(&buf[20],"  ")))) {
  1416.             no = asctodec(buf);
  1417.             memset(buf3,0,91);
  1418.             if(!xfgets(buf3,81)) goto hpend;
  1419.             if(rtncut(buf3))
  1420.                 p_linecount++;
  1421.             if(*buf3 != '(') continue;
  1422.             if(titlemode) {
  1423.                 if(buf[3] == '/') {
  1424.                     memset(bufwork,0,81);
  1425.                     strncpy(bufwork,buf,3);
  1426.                     strncat(bufwork,&buf3[6],9);
  1427.                     strncat80(bufwork,&buf[9]);
  1428.                 }
  1429.                 else {
  1430.                     memset(bufwork,0,81);
  1431.                     strncpy(bufwork,buf,5);
  1432.                     strncat(bufwork,&buf3[6],9);
  1433.                     strncat80(bufwork,&buf[11]);
  1434.                 }
  1435.             }
  1436.             else strcpy(bufwork,buf);
  1437.             memcpy(heya,&buf3[1],2);
  1438.             if(headcheck(NFORUM)) goto hpend;
  1439.             if(!strncmp(savebuf,"- ",2) && savebuf[2] != 'M') {
  1440.                 if(!strlen(forumname) || !strstr(savebuf,forumname)) {
  1441.                     saveheya[0] = 0;
  1442.                     for(i=2,j=0;savebuf[i] != ' ' && j < 8;i++,j++)
  1443.                         forumname[j] = savebuf[i];
  1444.                     forumname[j] = 0;
  1445.                 }
  1446.             }
  1447.             if((saveheya[0] != 'X' && strncmp(saveheya,heya,2)) ||
  1448.              (p_tail && p_tail->mode != NFORUM && p_tail->mode != NMESHEAD)) {
  1449.                 if(i = bytedec(&heya[0]))
  1450.                     fmeslibno = i;
  1451.                 gp = p;
  1452.                 if(heyasepa()) break;
  1453.                 preno = 0;
  1454.             }
  1455.             if(preno && no != preno + 1 && no != preno - 1) {
  1456.                   if(setpoint3(NSEPA,spalate)) break;
  1457.             }
  1458.             memcpy(saveheya,heya,2);
  1459.             preno = no;
  1460.             if(setpoint3(NFORUM,bufwork)) break;
  1461.             if(buf[3] == '/') {
  1462.                 nifidsetsub(&buf[10]);
  1463.             }
  1464.             else {
  1465.                 nifidsetsub(&buf[12]);
  1466.                 p_tail->flag |= FCYCLE;
  1467.             }
  1468.             tbl_set(p_tail);
  1469.             p_tail->p->id = no;
  1470.             if(isdigit(buf3[50]))        no = asctodec(&buf3[50]);
  1471.             else if(isdigit(buf3[52]))    no = asctodec(&buf3[52]);
  1472.             else if(isdigit(buf3[54]))    no = asctodec(&buf3[54]);
  1473.             else                         no = 0;
  1474.             p_tail->p->cno = no;
  1475.             if(isdigit(buf3[23])) no = asctodec(&buf3[23]);
  1476.             else if(isdigit(buf3[35])) no = asctodec(&buf3[35]);
  1477.             else                   no = 0;
  1478.             p_tail->p->cid = no;
  1479.             passflag = 1;
  1480.             continue;
  1481.         }
  1482.         if(submode != STITLE && isdigit(buf[0]) /* HPチェック */
  1483.          && isdigit(buf[1]) && isdigit(buf[2])
  1484.          && !xstrncmp(&buf[3],"  [") && buf[8] == '/') {
  1485.             if(headcheck(NHP)) goto hpend;
  1486.             no = asctodec(buf);
  1487.             if(nmode == NHP && preno && no != preno + 1)
  1488.                 if(setpoint3(NSEPA,spalate)) break;
  1489.             preno = no;
  1490.             if(setpoint3(NHP,buf)) break;
  1491.             nifidsetsub(&buf[23]);
  1492.             tbl_set(p_tail);
  1493.             p_tail->p->id = no;
  1494.             passflag = 1;
  1495.             continue;
  1496.         }
  1497.         no = checkhpsub(buf);
  1498.         if(no == -2) goto hpend;
  1499.         if(no == -1) break;
  1500.         if(no == 2) {
  1501.             preno = 0;
  1502.             continue;
  1503.         }
  1504.         if(++linecount > MAXLINE) {
  1505.             if(stageset(nmode,xxp,xxplno)) break;
  1506.             linecount = 1;
  1507.         }
  1508.         continue;
  1509. hpend:
  1510.         if(mode == 1 || mode == 2)
  1511.             grh_sub(max,max);
  1512.         if(startmode < 8) break;
  1513.         if(fno++ >= maxfno) break;
  1514.         tbl_set(p_tail);
  1515.         if(!p_tail->p->tail)
  1516.             p_tail->p->tail = pp;
  1517.         xfclose();
  1518.         if(maxfno > 1) _fstrcpy((char far *)filename,file[fno-1]);
  1519.         xfopen(filename);
  1520.         cfno = fno;
  1521.         nmode = 0;
  1522.         topdisp();
  1523.         if(mode == 1 || mode == 2) {
  1524.             loc(39+1,line-1);iro(ILINE);
  1525.             sprintf(buf,"%3d",fno);
  1526.             print(buf);
  1527.             deforutoiro();
  1528.             max = filelength(fileno(fd));
  1529.             sprintf(buf,"ログファイル読み込み処理中(%ldByte)",max);
  1530.             grh_disp(buf,0);
  1531.             l = 0;
  1532.         }
  1533.     }
  1534.     if(p) {
  1535.         tbl_free(rsv_p);
  1536.         rsv_p = (PCELL far *)0;
  1537.         xxp = pp;
  1538.         xxplno = p_linecount;
  1539.         setpoint2(NEND,dataend);
  1540.         pend=2;
  1541.     }
  1542. }
  1543.  
  1544. static int logstrcat(char *a,char *b)
  1545. {
  1546.     int i,j;
  1547.  
  1548.     if(!strlen(b)) return(0);
  1549.     for(i=j=0;b[i];i++) {
  1550. /*        if(b[i] <= ' ' || b[i] >= 0x7f)
  1551.             return(0);
  1552.         a[j++] = b[i]; */
  1553.         if(b[i] >= ' ')
  1554.             a[j++] = b[i];
  1555.     }
  1556.     a[j] = 0;
  1557.     return(j);
  1558. }
  1559.  
  1560. char logforum[9],loghpid[9],logmes[3],loglib[3],logniftyid[9];
  1561. static FILE *logfd;
  1562. static char dirbuf[128];
  1563. static char savedirbuf[128]="";
  1564. static char save2dirbuf[128]="";
  1565. static char dirbuf1[140];
  1566. static char logfmode;
  1567. static int logsavemode,log2mode,datk;
  1568. static int logputsub(char *path)
  1569. {
  1570.     char fname[53],buf[81];
  1571.  
  1572.     if(log2mode)
  1573.         return(0);
  1574.     sprintf(buf, "出力失敗.切り換え先ファイル名 = ");
  1575.     fname[0] = 50;
  1576.     strcpy(&fname[2],path);
  1577.     cgetfsx(buf, fname);
  1578.     if(!fname[2])
  1579.         return(0);
  1580.     strcpy(path,&fname[2]);
  1581.     return(1);
  1582. }
  1583.  
  1584. static int logopen(int mode)
  1585. {
  1586.     char buf[140],*w,work[81],*o,*p;
  1587.     int i,j,k;
  1588.     long ep=0;
  1589.  
  1590.     if(mode != -1) {
  1591.         if(!logdir[mode]) {
  1592.             logclose(1);
  1593.             return(-1);
  1594.         }
  1595.         logsavemode = mode;
  1596.         _fstrcpy((char far *)buf,logdir[mode]);
  1597.         for(i=j=0;buf[i];i++) {
  1598.             if(iskanji(buf[i]) && iskanji2(buf[i+1])) {
  1599.                 dirbuf[j++] = buf[i++];
  1600.                 dirbuf[j++] = buf[i];
  1601.                 continue;
  1602.             }
  1603.             if(buf[i] == '%') {
  1604.                 o = &buf[i+1];
  1605.                 if(p = jstrchr(o,'%')) {
  1606.                     *p++ = 0;
  1607.                     strcpy(work,o);
  1608.                     strupr(work);
  1609.                     i += strlen(o) + 1;
  1610.                     if(o = getenv(work)) {
  1611.                         strcpy(&dirbuf[j],o);
  1612.                         j += strlen(o);
  1613.                     }
  1614.                     continue;
  1615.                 }
  1616.             }
  1617.             if(buf[i] == '$') {
  1618.                 switch(buf[++i]) {
  1619.                 case 'f':    k = logstrcat(&dirbuf[j],logforum);
  1620.                             break;
  1621.                 case 'h':    k = logstrcat(&dirbuf[j],loghpid);
  1622.                             break;
  1623.                 case 'i':    k = logstrcat(&dirbuf[j],logniftyid);
  1624.                             break;
  1625.                 case 'm':    k = logstrcat(&dirbuf[j],logmes);
  1626.                             break;
  1627.                 case 'l':    k = logstrcat(&dirbuf[j],loglib);
  1628.                             break;
  1629.                 case 'y':    k = logstrcat(&dirbuf[j],YEAR);
  1630.                             break;
  1631.                 case 'Y':    k = logstrcat(&dirbuf[j],year);
  1632.                             break;
  1633.                 case 'T':    k = logstrcat(&dirbuf[j],mon);
  1634.                             break;
  1635.                 case 'D':    k = logstrcat(&dirbuf[j],mday);
  1636.                             break;
  1637.                 case 'H':    k = logstrcat(&dirbuf[j],hour1);
  1638.                             break;
  1639.                 case 'J':    k = logstrcat(&dirbuf[j],hour2);
  1640.                             break;
  1641.                 case 'M':    k = logstrcat(&dirbuf[j],min);
  1642.                             break;
  1643.                 case 'S':    k = logstrcat(&dirbuf[j],sec);
  1644.                             break;
  1645.                 case 'P':    k = logstrcat(&dirbuf[j],ampm);
  1646.                             break;
  1647.                 case 'a':    k = logstrcat(&dirbuf[j],mon2);
  1648.                             break;
  1649.                 default:    dirbuf[j] = buf[i]; k = 1; break;
  1650.                 }
  1651.                 j += k;
  1652.                 continue;
  1653.             }
  1654.             if(buf[i] <= ' ' || buf[i] == 0x7f) continue;
  1655.             dirbuf[j++] = buf[i];
  1656.         }
  1657.         dirbuf[j] = 0;
  1658.     }
  1659.     if(!strlen(dirbuf)) {
  1660.         logclose(1);
  1661.         return(-1);
  1662.     }
  1663.     if(!strcmp(dirbuf,savedirbuf))
  1664.         return(0);
  1665.     if(strlen(save2dirbuf) && !strcmp(dirbuf,save2dirbuf))
  1666.         return(0);
  1667.     logclose(1);
  1668.     save2dirbuf[0] = 0;
  1669.     while(1) {
  1670.         logfd = fopen_sub(dirbuf,0);
  1671.         if(!logfd) {
  1672.             if(!strlen(save2dirbuf)) strcpy(save2dirbuf,dirbuf);
  1673.             if(!logputsub(dirbuf)) {
  1674.                 save2dirbuf[0] = 0;
  1675.                 return(-1);
  1676.             }
  1677.         }
  1678.         else break;
  1679.     }
  1680.     logfmode = 1;
  1681.     strcpy(savedirbuf,dirbuf);
  1682.     if((tagmode == 1 || tagmode ==2) && !log2mode) {
  1683.         get_fdir(dirbuf,dirbuf1);
  1684.         for(i=0,datk=-1;datf[i];i++) {
  1685.             _fstrcpy((char far *)buf,datf[i]);
  1686.             if(!(w=jstrchr(buf,' '))) break;
  1687.             *w = 0;
  1688.             if(strcmp(buf,dirbuf1))    continue;
  1689.             w++;
  1690.             if(w[0] == '@') ep = atol(&w[1]);
  1691.             else {
  1692.                 logfmode = 0;
  1693.                 ep = atol(w);
  1694.             }
  1695.             datk = i;
  1696.             break;
  1697.         }
  1698.         midokuno = ep;
  1699.     }
  1700.     return(0);
  1701. }
  1702.  
  1703. static int logeditsub(PCELL far *tcu)
  1704. {
  1705.     char buf[81];
  1706.     int k,m;
  1707.  
  1708.     if(!logfd)
  1709.         return(0);
  1710.     tbl_set(tcu);
  1711.     if(tcu->p->top == tcu->p->tail)
  1712.         return(0);
  1713.     if((tagmode  ==1 || tagmode == 2) && !log2mode
  1714.      && logfmode && (tcu->mode < NHPHEAD)) {
  1715.         if(!(tcu->flag & FYOMI))
  1716.             logfmode = 0;
  1717.         else midokuno++;
  1718.     }
  1719. loged_01:
  1720.     if(m = bunget(tcu,0)) {
  1721.         for(k=0;k < m-1;k++) {
  1722.             _fstrcpy((char far *)buf,buf1[k]);
  1723.             farfree(buf1[k]);
  1724.             buf1[k] = 0;
  1725.             if(fputs(buf,logfd) == EOF) {
  1726.                 for(;buf1[k] && k < MAXLINE;k++) {
  1727.                     farfree(buf1[k]);
  1728.                     buf1[k] = 0;
  1729.                 }
  1730.                 logclose(1);
  1731.                 if(logputsub(dirbuf)) {
  1732.                     if(!logopen(-1))
  1733.                         goto loged_01;
  1734.                 }
  1735.                 return(-1);
  1736.             }
  1737.         }
  1738.     }
  1739.     return(0);
  1740. }
  1741.  
  1742. void logclose(int mode)    /* mode = 0:疑似クローズ 1:強制クローズ */
  1743. {
  1744.     char buf[150],fname[129],*a;
  1745.     int fid;
  1746.     struct tm *jtime;
  1747.     time_t ltime[1];
  1748.     struct ftime ftime;
  1749.  
  1750.  
  1751.     if(!mode) return;
  1752.     if(!logfd)
  1753.         return;
  1754.     if((tagmode == 1 || tagmode == 2) && !log2mode) {
  1755.         if(datk != -1) {
  1756.             farfree(datf[datk]);
  1757.             datf[datk] = 0;
  1758.         }
  1759.         else {
  1760.             for(datk=0;datf[datk];datk++)
  1761.                 ;
  1762.         }
  1763.         if(midokuno) {
  1764.             if(logfmode) sprintf(buf,"%s @%d",dirbuf1,midokuno);
  1765.             else         sprintf(buf,"%s %d",dirbuf1,midokuno);
  1766.             if(datf[datk]=farmalloc(strlen(buf)+1))
  1767.                 _fstrcpy(datf[datk],(char far *)buf);
  1768.             else errdisp1(memgeterror);
  1769.         }
  1770.     }
  1771.     if(tagmode >= 3) {
  1772.         get_fdir(savedirbuf,fname);        /* フルパス名取得 */
  1773.         strcpy(buf,datfile);
  1774.         if(strlen(buf)) {
  1775.             if(!(a = jstrrchr(fname,'\\'))) {
  1776.                 strcat(buf,fname);
  1777.             }
  1778.             else {
  1779.                 strcat(buf,++a);
  1780.             }
  1781.         }
  1782.         else strcpy(buf,fname);
  1783.         if((a = jstrrchr(buf,'.')))
  1784.             *a = 0;
  1785.         strcat(buf,".");
  1786.         strcat(buf,nifsafix);
  1787.         time(ltime);
  1788.         jtime = localtime(ltime);
  1789.         ftime.ft_year = jtime->tm_year-80;
  1790.         ftime.ft_month = jtime->tm_mon+1;
  1791.         ftime.ft_day = jtime->tm_mday;
  1792.         ftime.ft_hour = jtime->tm_hour;
  1793.         ftime.ft_min = jtime->tm_min;
  1794.         ftime.ft_tsec = jtime->tm_sec & 0xfe;
  1795.         fid = open(buf,O_RDWR,S_IREAD | S_IWRITE);
  1796.         if(fid) {
  1797.             setftime(fid,&ftime);
  1798.             close(fid);
  1799.         }
  1800.     }
  1801.     fclose(logfd);
  1802.     logfd = (FILE *)0;
  1803.     savedirbuf[0] = 0;
  1804. }
  1805.  
  1806. static int logfputs(char *buf)
  1807. {
  1808.     strcat(buf,"\n");
  1809.     while(1) {
  1810.         if(fputs(buf,logfd) != EOF)
  1811.             return(0);
  1812.         logclose(1);
  1813.         if(logputsub(dirbuf)) {
  1814.             if(!logopen(-1))
  1815.                 continue;
  1816.         }
  1817.         break;
  1818.     }
  1819.     return(-1);
  1820. }
  1821.  
  1822. void xstrncpy(char *a,char *b)
  1823. {
  1824.      int i,j;
  1825.  
  1826.     for(i=0;b[i] && b[i] <= ' ';i++)
  1827.         ;
  1828.     for(j=0;b[i] && b[i] > ' ' && i < 8;i++)
  1829.         a[j++] = b[i];
  1830.     a[j] = 0;
  1831. }
  1832.  
  1833. int logedit1(PCELL far *pt,int mode,int mode2) /* ログ整理 */
  1834. {
  1835.     char buf[90],*a;
  1836.     int m;
  1837.  
  1838.     log2mode = mode;
  1839.     if(mode2) mode2 = LETC+1;
  1840.     tbl_set(pt);
  1841.     _fstrcpy((char far *)buf,pt->p->title);
  1842.     switch(pt->mode) {
  1843.     case NHP:        m = LHP;
  1844.                     break;
  1845.     case NMAIL:        m = LMAIL;
  1846.                     break;
  1847.     case NFORUM:    m = LFORUM;
  1848.                     break;
  1849.     case NNEWS:        m = LNEWS;
  1850.                     break;
  1851.     case NBBS:        m = LBBS;
  1852.                     break;
  1853.     case NNOTE:        m = LNOTE;
  1854.                     break;
  1855.     case NSINBUN:    m = LSINBUN;
  1856.                     break;
  1857.     case NHPWRITE:    m = LHPWRITE;
  1858.                     break;
  1859.     case NFWRITE:    m = LFWRITE;
  1860.                     break;
  1861.     case NGUEST:    m = LGUEST;
  1862.                     break;
  1863.     case NLIBDATA:    m = LLIBDATA;
  1864.                     break;
  1865.     case NFNEWS:    m = LFNEWS;
  1866.                     break;
  1867.     case NFBBS:        m = LFBBS;
  1868.                     break;
  1869.     case NMWRITE:    m = LMWRITE;
  1870.                     break;
  1871.     case NWRITE:    m = LWRITE;
  1872.                     break;
  1873.     case NPROF:     m = LPROF;
  1874.                     break;
  1875.     case NINFO:        m = LINFO;
  1876.                     break;
  1877.     case NTENKI:    m = LTENKI;
  1878.                     break;
  1879.     case NHPHEAD:
  1880.                     if(pt->next->mode != NHP && pt->next->mode != NTITLE)
  1881.                         return(0);
  1882.                     _fstrcpy((char far *)loghpid,pt->p->nifid);
  1883.                     m = LHPHEAD;
  1884.                     goto loged_01;
  1885.     case NMAILHEAD:
  1886.                     m = LMAILHEAD;
  1887. loged_00:            _fstrcpy((char far *)logniftyid,pt->p->nifid);
  1888.                     break;
  1889.     case NFORUMHEAD:
  1890.     case NFORUM2:
  1891.                     _fstrcpy((char far *)logforum,pt->p->nifid);
  1892.                     m = LFORUMHEAD;
  1893.                     break;
  1894.     case NNEWSHEAD:    m = LNEWSHEAD;
  1895.                     break;
  1896.     case NBBSHEAD:    m = LBBSHEAD;
  1897.                     break;
  1898.     case NCBHEAD:    m = LCBHEAD;
  1899.                     break;
  1900.     case NNOTEHEAD:    m = LNOTEHEAD;
  1901.                     break;
  1902.     case NBILLHEAD:
  1903.                     m = LBILLHEAD;
  1904.                     goto loged_00;
  1905.     case NBYEHEAD:
  1906.                     m = LBYEHEAD;
  1907.                     goto loged_00;
  1908.     case NSINBUNHEAD: m = LSINBUNHEAD;
  1909.                     break;
  1910.     case NLIBHEAD:
  1911.                     _fstrcpy((char far *)logforum,pt->p->nifid);
  1912.                     sprintf(loglib,"%02d",pt->p->cno);
  1913.                     m = LLIBHEAD;
  1914. loged_03:            if(logopen(m+mode2)) return(-1);
  1915.                     if(logfputs(buf)) return(-1);
  1916.                     if(logeditsub(pt)) return(-1);
  1917.                     logclose(0);
  1918.                     return(0);
  1919.     case NMESHEAD:
  1920.                     _fstrcpy((char far *)logforum,pt->p->nifid);
  1921.                     sprintf(logmes,"%02d",pt->p->cno);
  1922.                     if(pt->next->mode != NFORUM)
  1923.                         return(0);
  1924.                     m = LMESHEAD;
  1925. loged_01:            if(logopen(m+mode2)) return(-1);
  1926.                     if(logfputs(buf)) return(-1);
  1927.                     logclose(0);
  1928.                     return(0);
  1929.     case NFRTHEAD:    m = LFRTHEAD;
  1930. loged_02:            _fstrcpy((char far *)logforum,pt->p->nifid);
  1931.                     goto loged_03;
  1932.     case NFRSHEAD:    m = LFRSHEAD;
  1933.                     goto loged_02;
  1934.     case NFRTIMEHEAD: m = LFRTIMEHEAD;
  1935.                     goto loged_02;
  1936.     case NOPTHEAD: m = LOPTHEAD;
  1937.                     goto loged_02;
  1938.     case NFNEWSHEAD: m = LFNEWSHEAD;
  1939.                     goto loged_02;
  1940.     case NFBBSHEAD: m = LFBBSHEAD;
  1941.                     goto loged_02;
  1942.     case NLIBNOHEAD: m = LLIBNOHEAD;
  1943.                     goto loged_02;
  1944.     case NMESNOHEAD: m = LMESNOHEAD;
  1945.                     goto loged_02;
  1946.     case NMEMBERHEAD: m = LMEMBERHEAD;
  1947.                     break;
  1948.     case NINFOHEAD: m = NINFOHEAD;
  1949.                     break;
  1950.     case NMRCVHEAD:    m = LMRCVHEAD;
  1951.                     break;
  1952.     case NSDLHEAD:    m = LSDLHEAD;
  1953.                     break;
  1954.     case NRCLHEAD:    m = LRCLHEAD;
  1955.                     break;
  1956.     case NTITLE:    m = LTITLE;
  1957.                     break;
  1958.     case NINIT:        m = LINIT;
  1959.                     goto loged_00;
  1960.     case NTOP:        m = LTOP;
  1961.                     break;
  1962.     case NMYFORUM:    m = LMYFORUM;
  1963.                     break;
  1964.     case NPATIOHEAD: _fstrcpy((char far *)logforum,pt->p->nifid);
  1965.                     m = LPATIOHEAD;
  1966.                     break;
  1967.     case NPGUEST:    m = LPGUEST;
  1968.                     break;
  1969.     default:        m = LETC;
  1970.                     break;
  1971.     }
  1972.     if(logopen(m+mode2)) return(-1);
  1973.     if(logeditsub(pt)) return(-1);
  1974.     logclose(0);
  1975.     return(0);
  1976. }
  1977.  
  1978. static char *nifoutsub(char *buf) {
  1979.     char *o;
  1980.  
  1981.     o = jstrchr(buf,',');
  1982.     if(o) *o++ = 0;
  1983.     return(o);
  1984. }
  1985.  
  1986. static long nifouthex(char *buf) {
  1987.     long l,i;
  1988.     char c;
  1989.  
  1990.     for(l=0;c = *buf;buf++) {
  1991.         if(c >= '0' && c <= '9') i=c-'0';
  1992.         else i=c-'a'+10;
  1993.         l = l*16 + i;
  1994.     }
  1995.     return(l);
  1996. }
  1997.  
  1998. int nifoutropen(void) {
  1999.     char fname[129],*a,buf[150];
  2000.     struct stat sbuf,sbuf2;
  2001.  
  2002.     get_fdir(filename,fname);    /* フルパス名取得 */
  2003.     strcpy(nifoutfname,datfile);
  2004.     if(strlen(nifoutfname)) {
  2005.         if(!(a = jstrrchr(fname,'\\'))) {
  2006.             strcat(nifoutfname,fname);
  2007.         }
  2008.         else {
  2009.             strcat(nifoutfname,++a);
  2010.         }
  2011.     }
  2012.     else strcpy(nifoutfname,fname);
  2013.     strcpy(buf,fname);
  2014.     strcat(buf,"\n");
  2015.     if((a = jstrrchr(nifoutfname,'.')))
  2016.         *a = 0;
  2017.     strcpy(nifoutfname2,nifoutfname);
  2018.     strcat(nifoutfname,".");
  2019.     strcat(nifoutfname,nifsafix);
  2020.     strcat(nifoutfname2,".###");
  2021.     strcpy(nifoutfname1,fname);
  2022.     if(stat(filename,&sbuf) || stat(nifoutfname,&sbuf2))
  2023.         return(-1);
  2024.     if(timechkmode && (sbuf.st_atime > sbuf2.st_atime))
  2025.         return(-1);
  2026.     nifoutfd = fopen(nifoutfname,"rt");
  2027.     if(!nifoutfd)
  2028.         return(-1);
  2029.     for(;;) {
  2030.         if(fgets(buf,150,nifoutfd) == NULL) break;
  2031.         rtncut(buf);
  2032.         if(!strcmp(buf,nifoutfname1)) return(0);
  2033.         for(;;) {
  2034.             if(fgets(buf,150,nifoutfd) == NULL) return(-1);
  2035.             nifoutsub(buf);
  2036.             if(nifouthex(buf) == NEND) break;
  2037.         }
  2038.     }
  2039.     return(-1);
  2040. }
  2041.  
  2042. int nifoutopen(void) {
  2043.     char buf[150];
  2044.  
  2045.     remove(nifoutfname2);
  2046.     if(!(nifoutfd2 = fopen(nifoutfname2,"at"))) {
  2047.         errdisp2("XXXX.NIFファイルのオープンに失敗");
  2048.         return(-1);
  2049.     }
  2050.     if(nifoutfd = fopen(nifoutfname,"rt")) {
  2051.         for(;;) {
  2052.             if(fgets(buf,150,nifoutfd) == NULL) break;
  2053.             if(fputs(buf,nifoutfd2) == EOF) {
  2054.                 goto nifouto_err;
  2055.             }
  2056.             rtncut(buf);
  2057.             if(!strcmp(buf,nifoutfname1)) {
  2058.                 for(;;) {
  2059.                     if(fgets(buf,150,nifoutfd) == NULL) return(0);
  2060.                     nifoutsub(buf);
  2061.                     if(nifouthex(buf) == NEND) break;
  2062.                 }
  2063.                 return(0);
  2064.             }
  2065.             for(;;) {
  2066.                 if(!fgets(buf,150,nifoutfd)) return(0);
  2067.                 if(fputs(buf,nifoutfd2) == EOF) {
  2068.                     goto nifouto_err;
  2069.                 }
  2070.                 nifoutsub(buf);
  2071.                 if(nifouthex(buf) == NEND) break;
  2072.             }
  2073.         }
  2074.     }
  2075.     strcpy(buf,nifoutfname1);
  2076.     strcat(buf,"\n");
  2077.     if(fputs(buf,nifoutfd2) == EOF) {
  2078. nifouto_err:
  2079.         errdisp2("XXXX.NIFファイルの書き込みに失敗");
  2080.         fclose(nifoutfd);
  2081.         fclose(nifoutfd2);
  2082.         return(-1);
  2083.     }
  2084.     return(0);
  2085. }
  2086.  
  2087. int nifoutput(PCELL far *pt) {
  2088.     char buf[150],work[128],nifid[9],title[81];
  2089.     int count,flag;
  2090.  
  2091.     flag = (int)pt->flag;
  2092.     flag &= (FYOMI + FTAG +FCYCLE);
  2093.     count = pt->grp->count;
  2094.     memset(nifid,0,9);
  2095.     tbl_set(pt);
  2096.     _fmemcpy((char far *)nifid,pt->p->nifid,8);
  2097.     _fstrcpy((char far *)title,pt->p->title);
  2098.     sprintf(buf,"%x,%x,%x,%lx,",
  2099.      pt->mode,flag,pt->count,pt->p->top);
  2100.     sprintf(work,"%lx,",pt->p->tail);
  2101.     strcat(buf,work);
  2102.     sprintf(work,"%x,",count);
  2103.     strcat(buf,work);
  2104.     sprintf(work,"%x,-%lx,%s,%x,%x,%x,%s\n",
  2105.      pt->p->cmt,pt->p->lineno,nifid,pt->p->id,pt->p->cno,pt->p->cid,title);
  2106.     strcat(buf,work);
  2107.     if(nifoutfd2) {
  2108.         if(fputs(buf,nifoutfd2) == EOF) {
  2109.             errdisp2("XXXX.NIFファイルの書き込みに失敗");
  2110.             return(-1);
  2111.         }
  2112.     }
  2113.     return(0);
  2114. }
  2115.  
  2116. int nifoutget(void) {
  2117.     char buf[150],*o,*s;
  2118.     int grp,i,j;
  2119.     PCELL far *pt;
  2120.     PCELL far *pt2;
  2121.     PCELL far *w;
  2122.  
  2123.     if(!fgets(buf,150,nifoutfd)) return(1);
  2124.     rtncut(buf);
  2125.     pt = tbl_alloc(0);
  2126.     if(!pt) {
  2127.         errdisp3(memgeterror);
  2128.         return(-1);
  2129.     }
  2130.     o=nifoutsub(buf);
  2131.     pt->mode = (char)nifouthex(buf);
  2132.     s = o;
  2133.     o=nifoutsub(s);
  2134.     pt->flag = (char)nifouthex(s);
  2135.     s = o;
  2136.     o=nifoutsub(s);
  2137.     pt->count = (int)nifouthex(s);
  2138.     tbl_set(pt);
  2139.     pt->p->fno = fno;
  2140.     s = o;
  2141.     o=nifoutsub(s);
  2142.     pt->p->top = nifouthex(s);
  2143.     s = o;
  2144.     o=nifoutsub(s);
  2145.     pt->p->tail = nifouthex(s);
  2146.     s = o;
  2147.     o=nifoutsub(s);
  2148.     grp = (int)nifouthex(s);
  2149.     if(pt->count == grp) pt->grp = pt;
  2150.     else {
  2151.         for(w=p_tail;w;w=w->back) {
  2152.             if(w->count != grp) continue;
  2153.             pt->grp = w;
  2154.             break;
  2155.         }
  2156.         if(!w) pt->grp = pt;
  2157.     }
  2158.     s = o;
  2159.     o=nifoutsub(s);
  2160.     pt->p->cmt = (int)nifouthex(s);
  2161.     s = o;
  2162.     o=nifoutsub(s);
  2163.     if(*s == '-') {
  2164.         pt->p->lineno = nifouthex(s+1);
  2165.         s = o;
  2166.         o=nifoutsub(s);
  2167.     }
  2168.     else pt->p->lineno = 0;
  2169.     _fstrncpy(pt->p->nifid,(char far *)s,8);
  2170.     s = o;
  2171.     o=nifoutsub(s);
  2172.     pt->p->id = (int)nifouthex(s);
  2173.     s = o;
  2174.     o=nifoutsub(s);
  2175.     pt->p->cno = (int)nifouthex(s);
  2176.     s = o;
  2177.     o=nifoutsub(s);
  2178.     pt->p->cid = (int)nifouthex(s);
  2179.     _fstrcpy(pt->p->title,(char far *)o);
  2180.     if(!p_tail) {
  2181.         p_top = p_head = p_tail = pt;
  2182.     }
  2183.     else {
  2184.         if(p_tail->mode == NFORUM || p_tail->mode == NHP) {
  2185.             tbl_set(p_tail);
  2186.             i = p_tail->p->id;
  2187.             tbl_set(pt);
  2188.             j = pt->p->id;
  2189.             if(i && j && j != i+1 && j != i-1) {
  2190.                 if((pt2=cmtsepa(pt->grp)) != (PCELL far *)-1) {
  2191.                     p_tail->next = pt2;
  2192.                     pt2->back = p_tail;
  2193.                     p_tail = pt2;
  2194.                     p++;
  2195.                 }
  2196.             }
  2197.         }
  2198.         p_tail->next = pt;
  2199.         pt->back = p_tail;
  2200.         p_tail = pt;
  2201.     }
  2202.     p++;
  2203.     if(pt->mode == NEND) return(1);
  2204.     return(0);
  2205. }
  2206.  
  2207. void nifoutclose(int mode) {
  2208.     char buf[150];
  2209.  
  2210.     if(mode) {
  2211.         for(;;) {
  2212.             if(!nifoutfd || fgets(buf,150,nifoutfd) == NULL) break;
  2213.             if(fputs(buf,nifoutfd2) == EOF) {
  2214.                 errdisp2("XXXX.NIFファイルの書き込みに失敗");
  2215.                 break;
  2216.             }
  2217.         }
  2218.         if(nifoutfd) {
  2219.             fclose(nifoutfd);
  2220.             remove(nifoutfname);
  2221.         }
  2222.         if(nifoutfd2) {
  2223.             fclose(nifoutfd2);
  2224.             rename(nifoutfname2,nifoutfname);
  2225.         }
  2226.     }
  2227.     else {
  2228.         if(nifoutfd) fclose(nifoutfd);
  2229.     }
  2230. }
  2231.